#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

////暴力排序
////时间复杂度O(n + nlog(n))，空间复杂度O(1)
//vector<int> sortedSquares(vector<int>& vec) 
//{
//    for (int i = 0; i < vec.size(); i++)
//    {
//        vec[i] *= vec[i];
//    }
//    sort(vec.begin(), vec.end()); // 快速排序
//    return vec;
//}

//双指针法
//定义一个新数组result，和A数组一样的大小，让k指向result数组终止位置。
//
//如果A[i] * A[i] < A[j] * A[j] 那么result[k--] = A[j] * A[j]; 。
//
//如果A[i] * A[i] >= A[j] * A[j] 那么result[k--] = A[i] * A[i]; 
vector<int> sortedSquares(vector<int>& A)
{
    int k = A.size() - 1;
    vector<int> result(A.size(), 0);
    for (int i = 0, j = A.size() - 1; i <= j;) 
    { // 注意这里要i <= j，因为最后要处理两个元素
        if (A[i] * A[i] < A[j] * A[j]) 
        {
            result[k--] = A[j] * A[j];
            j--;
        }
        else {
            result[k--] = A[i] * A[i];
            i++;
        }
    }
    for(int i = 0; i < result.size(); ++i)
    {
        cout << result[i] << " ";
    }
    return result;
}

int main()
{
    int n;
    cin >> n;
    vector<int> vec;
    int temp;
    for(int i = 0; i < n; ++i)
    {
        cin >> temp;
        vec.push_back(temp);

    }

    sortedSquares(vec);
    //for(int i = 0; i < n; ++i)
    //{
    //    cout << vec[i] << " ";
    //}
    cout << endl;
    return 0;
}
